このページは、2008 年 4 月 01 日に最後に変更されました。

edocs ホーム > BEA AquaLogic Data Services Platform 3.0/3.2 ドキュメント > ALDSP 3.2 新機能のドキュメント

ミューテータ関数の例

このトピックでは、組み込みのミューテータ関数を使用して一般的な更新操作を実行する方法のいくつかの例を挙げています。

単純なパラメータに基づく更新

次の例では、customer ID (cid) および Social Security Number (ssn) の 2 つの単純な入力 パラメータを受け入れるデータ サービス更新操作を示しています。

declare procedure tns:update($cid as xs:string, $ssn as xs:string) {
   declare $c as element(customer) := getCustomerByCustID($cid);
   declare $cc as changed-element(customer) := fn-bea:changed-element($c);
   set $cc := fn-bea:replace-value($cc, "ssn", $ssn);
   tns:updateCUSTOMER($cc);
}

update() 操作は getCustomerByCustID()操作を呼び出して顧客データを取得し、ssn パラメータに基づいて社会保障番号を更新します。また、この例では、updateCUSTOMER() データ サービス操作を呼び出してデータ ソースを更新します。

複合入力パラメータに基づく更新

次の例では、複合入力パラメータを受け入れるデータ サービス更新操作を示しています。

この例では、以下の入力パラメータが使用されます。

p_customer パラメータ 

<p_customer>
   <customer_id>1</customer_id>
   <ssn>545-54-5445</ssn>
</p_customer >

p_address パラメータ

<p_address>
   <address_id>1</address_id>
   <street1>1108 Delmas Ave</street1>
   <street2></street2>
   <address_type>HOME</address_type>
</p_address>

getCustomerByCustID() オペレーションが以下のデータを返します。

getCustomerByCustID() で返されたデータ

<customer>
   <customer_id>1</customer_id>
   <first_name>John</first_name>
   <last_name>Deer</last_name>
   <ssn>123-12-1234</ssn>
   <address>
      <address_id>1</address_id>
      <customer_id>1</customer_id>
      <city>San Jose</city>
      <street1>123 Main Street</street1>
      <street2>Apt 808</street2>
      <address_type>HOME</address_type>
   </address>
</customer>

例 - 複合入力パラメータに基づく値の置き換え

以下の例では、getCustomerByCustID() オペレーションを呼び出して顧客データを取得し、最上位ノードおよび複数の子ノードがある階層形式でデータを返します。また、この例では、1 番目のパラメータを通して提供されたデータを使用することで Social Security Number (ssn) 要素を更新し、2 番目のパラメータのデータに基づくストリート要素を更新します。

最後に、この例では、updateCUSTOMER() データ サービス オペレーションを呼び出してデータ ソースを更新します。

declare procedure tns:update($p1 as element(p_customer),
                             $p2 as element(p_address)) {
   declare $c as element(customer) := getCustomerByCustID($p1/customer_id);
   declare $cc as changed-element(customer) := fn-bea:changed-element($c);

   set $cc := fn-bea:replace-value($cc, "ssn", fn:data($p1/ssn));

   iterate $a at $i over $c/address {
      if ($a/address_type eq $p2/address_type) {
         declare $path1 as xs:string := concat("address[", $i, "]/street1");
         declare $path2 as xs:string := concat("address[", $i, "]/street2");
         set $cc := fn-bea:replace-value($cc, $path1, data($p2/street1));
         set $cc := fn-bea:replace-value($cc, $path2, data($p2/street2));
      }
   }

   tns:updateCustomer($cc);
}

例 - 複合入力パラメータに基づく新しい要素の挿入

以下の例では、getCustomerByCustID() 操作を呼び出して顧客データを取得し、最上位ノードおよび複数の子ノードがある階層形式でデータを返します。次に例では、顧客要素にアドレスを挿入するために、新しいアドレス要素を宣言し、フィールドを挿入して、組み込み insert-into() 関数を使用します。

最後に、この例では、updateCUSTOMER() データ サービス オペレーションを呼び出してデータ ソースを更新します。

declare procedure tns:update($p1 as element(p_customer),
                             $p2 as element(p_address)) {
   declare $c as element(customer) := getCustomerByCustID($p1/customer_id);
   declare $cc as changed-element(customer) := fn-bea:changed-element($c);

   declare $addr as element(AddressType):=
      <address>
         <address_id>{data($p2/address_id)}</address_id>
         <customer_id>{data($p1/customer_id}</customer_id>
         <city>{data($p2/city)}</city>
         <street1>{data($p2/street1)}</street1>
         <street2>{data($p2/street1)}</street2>
         <address_type>{data($p2/address_type)}</address_type>
      </address>

   set $cc := fn-bea:insert-into($cc, ".", $addr);

   (: この呼び出しによって、顧客が更新され、新規 アドレスが挿入されます。:)
   tns:updateCustomer($cc);
}

パラメータの構造が戻り値の型と一致する場合の更新

次の例では、パラメータの構造が指定されたデータ サービスのために定義された戻り値の型に一致する場合、入力として複合型のパラメータを受け入れるデータ サービスの更新操作を示しています。

この例では、以下の入力パラメータが使用されます。

p_customer パラメータ

<p_customer>
   <customer_id>1</customer_id>
   <ssn>545-54-5445</ssn>
   <address>
      <address_id>1</address_id>
      <city>San Jose</city>
      <street1>1108 Delmas Ave</street1>
      <street2></street2>
      <address_type>HOME</address_type>
   </address>
   <address>
      <address_id>2</address_id>
      <city>San Jose</city>
      <street1>1108 First St.</street1>
      <street2></street2>
      <address_type>WORK</address_type>
   </address>
</p_customer>

getCustomerByCustID() 操作は以下のデータを返します。

getCustomerByCustID() で返されたデータ

<customer>
   <customer_id>1</customer_id>
   <first_name>John</first_name>
   <last_name>Smith</last_name>
   <ssn>123-12-1234</ssn>
   <address>
      <address_id>1</address_id>
      <customer_id>1</customer_id>
      <city>Santa Clara</city>
      <street1>350 El Camino Real</street1>
      <street2>Test Street</street2>
      <address_type>HOME</address_type>
   </address>
</customer>

例 - 複合要素におけるすべての値の置き換え

次の例では、基底のデータ ソースのすべての値を置き換えるために、データ サービス内の updateCustomer() 操作を呼び出します (更新が主キーに基づいて実行されます)。これは入力パラメタの構造がデータ サービスのために定義された戻り値型に一致しているので、可能です。

この例では、$ce の各子要素の値が $va の対応する子要素の値 (同名を使用して) に置き換えるヘルパー プロシージャを含んでいることに注意してください。
declare procedure tns:replace-values($ce as changed-element(),
                                     $path as xs:string,
                                     $va as element()) as changed-element() {
   declare $parent as changed-element() := $ce;
   declare $child as element() := fn-bea:current-value($ce);

   (: $path に従っって手動でナビゲーション :)
   iterate $step over tokenize($path, "/|[") {
      if (starts-with($step, "[") {
         (: これはフィルタ (位置のフィルタが前提) であり、削除する。)
         (: フィルタの角括弧であって、同じフィルタに適用する。:)
         set $index as xs:string := substring($step, 2, string-length($step) - 2);
         set $child := $child[xs:integer($index)]
      } else {
         set $child := $child/[local-name() eq $step]
      }
   }

   iterate $leaf over $child/* {
      declare $vaChild as element() := $va/*[local-name() eq local-name($leaf)];
      if (exists($vaChild)) {
         declare $cpath = concat($path, "/", local-name($leaf));
         set $parent := fn-bea:replace-value($parent, $cpath, data($vaChild));
      }
   }

   return value $parent;
}

declare procedure tns:update($p1 as element(p_customer)) {
   declare $cust as element(customer) := getCustomerByCustID($p1/customer_id);
   declare $ucust as changed-element(customer) := fn-bea:changed-element($cust);

   iterate $addr at $i over $p1/address {
      declare $uaddr as element(AddressType) :=
         <address>
            <address_id>{ data($addr/address_id) }</address_id>
            <customer_id>{ data($addr/customer_id) }</customer_id>
            <city>{ data($addr/city) }</city>
            <street1>{ data($addr/street1) }</street1>
            <street2>{ data($addr/street1) }</street2>
            <address_type>{ data($addr/address_type) }</address_type>
         </address>
      if (exists($cust/address[$i])) {
         declare $path as xs:string := concat("address[", $i , "]");
         set $ucust := tns:replace-values($ucust, $path, $uaddr);
      } else {
         set $ucust := fn-bea:insert-into($ucust, ".", $uaddr);
      }
   }

   tns:updateCustomer($uCustomer);
}

古い値と新規値の相違点に基づく更新

この例では、2 つの複合パラメータに基づく更新操作の実行方法を示します。1 つのパラメータは古い値を含め、他のパラメータは新しい値を含む可能性があります。

この例では、以下の入力パラメータが使用されます。

customer パラメータ (新規値)

<customer>
   <customer_id>1</customer_id>
   <first_name>John</first_name>
   <last_name>Smith</last_name>
   <ssn>345-43-4988</ssn>
</customer>

customer パラメータ (古い値)

<customer>
   <customer_id>1</customer_id>
   <first_name>Johnny</first_name>
   <last_name>Smithline</last_name>
   <ssn>345-43-4988</ssn>
</customer>

例 - 一連の if 文を使用して決定するパラメータの相違点に基づく更新

以下の例では、一連の if 文を使用して 2 つの入力パラメータ (1 番目は古い値を含め、2 番目は新規値を含む可能性があります) の相違点を比較します。そして、変更が識別された場合、この例では、基底のデータ ソースにデータを更新するためにデータ サービスにおける updateCustomer() 操作を呼び出します。

declare procedure tns:update($p_old as element(customer),
                             $p_new as element(customer)) {
   declare $cust as changed-element(customer) := fn-bea:changed-element($p_old);
   declare $modified as xs:boolean := false();

   if (data($p_old/customer_id) eq data($p_new/customer_id) ) then {
      if (data($p_old/first_name) ne data($p_new/first_name)) then {
         set $cust := fn-bea:replace-value($cust, "first_name", fn:data($p_new/first_name));
         set $modified := true();
      } else {}
      if (data($p_old/last_name) ne data($p_new/last_name)) then {
         set $cust := fn-bea:replace-value($cust, "last_name", fn:data($p_new/last_name));
         set $modified := true();
      } else {}
      if (data($p_old/ssn) ne data($p_new/ssn)) then {
         set $cust := fn-bea:replace-value($cust, "ssn", fn:data($p_new/ssn));
         set $modified := true();
      } else {}
      if ($modified) then {
         tns:updatecustomer($c);
      } else {}
   } else {}
}

例 - 反復を通じて決定するパラメータの相違点に基づく更新

以下の例では、要素を通して反復することによって、2 つの入力 パラメータの相違点を比較します。そして、変更が識別された場合、基底のデータ ソースにデータを更新するためにデータ サービスにおける updateCustomer() 操作を呼び出します。

declare procedure tns:update($p_old as element(customer),
                             $p_new as element(customer)) {
   declare $cust as changed-element(customer) := fn-bea:changed-element($p_old);
   declare $modified as xs:boolean := false();

   if (data($p_old/customer_id) eq data($p_new/customer_id) ) then {
      iterate $child over $p_old/* {
         declare $name as xs:string := local-name($child);
         declare $new := data($p_new/*[local-name() eq $name]);
         if (data($child) ne $new) {
            set $cust := fn-bea:replace-value($cust, $name, $new);
            set $modified := true();
         }
      }
      if ($modified) then {
         tns:updatecustomer($c);
      }
   }
}

追加のデータを使用した更新

この例では、更新操作を実行する前にデータを多彩にするために追加の関数コールを実行する方法を示します。

以下の入力パラメータが使用されます。

p_customer パラメータ

<p_customer>
   <customer_id>1</customer_id>
   <ssn>545-54-5445</ssn>
   <address>
      <address_id>1</address_id>
      <city>San Jose</city>
      <street1>1108 First St.</street1>
      <street2></street2>
      <country>US</country>
   </address>
</p_customer>

getCustomerByCustID() 操作は以下のデータを返します。

getCustomerByCustID() で返されたデータ

<customer>
   <customer_id>1</customer_id>
   <first_name>John</first_name>
   <last_name>Deer</last_name>
   <ssn>123-12-1234</ssn>
   <address>
      <address_id>1</address_id>
      <customer_id>1</customer_id>
      <city>San Jose</city>
      <street1>1108 First</street1>
      <street2></street2>
      <zip_code>95125</zip_code>
      <address_valid>N</address_valid>
      <country>US</country>
   </address>
</customer>

getValidAddress() 操作はパラメータとしてアドレス情報を受け入れて、アドレスが有効であるかどうかを示す妥当性コードと共に標準化されたアドレス要素を返します。getValidAddress() 操作は以下のデータを返します。

getValidAddress() で返されたデータ

<address>
   <city>San Jose</city>
   <street1>1108 1st Street</street1>
   <street2></street2>
   <zip_code>95131</zip_code>
   <address_valid>Y</address_valid>
   <country>US</country>
</address>

例 - 更新の前に追加データの取得

以下の例では、更新された情報に含めるように追加情報を取得するためにデータ サービスにおける読み取り処理を呼び出します。この例では、次に基底のデータ ソースにデータを更新するために適切な値を置き換えて、updateCustomer() 操作を呼びます。

declare procedure tns:update($p1 as element(p_customer)) {
   declare $c as element(customer) := getCustomerByCustID($p1/customer_id, p1/address_id);
   declare $cc as changed-element(customer) := fn-bea:changed-element($c);

   set $cc := fn-bea:replace-value($cc, "ssn", $p1/ssn);

   declare $vAddress as element(ValidAddress) := tns:getValidAddress(
      <ns1:address>
         <city>{ data($p1/city) }</city>
         <street1>{ data($p1/street1) }</street1>
         <street2>{ data($p1/stree2) }</street2>
         <country>{ data($p1/country) }</country>
      </ns1:address>);

   set $cc := fn-bea:replace-value($cc, "city", $vAddress/city)
   set $cc := fn-bea:replace-value($cc, "street1", $vAddress/street1)
   set $cc := fn-bea:replace-value($cc, "street2", $vAddress/street2)
   set $cc := fn-bea:replace-value($cc, "zip_code", $vAddress/zip_code)
   set $cc := fn-bea:replace-value($cc, "address_valid", $vAddress/address_valid)
   set $cc := fn-bea:replace-value($cc, "country", $vAddress/country)

   tns:updateCustomer($cc);
}

オペレーション複製の更新

この例では、変更されたデータを 2 つの異なるデータ ソースに送信する方法を示します。

以下の入力パラメータが使用されます。

p_customer パラメータ

<p_customer>
   <customer_id>1</customer_id>
   <ssn>545-54-5445</ssn>
   <first_name>Johan</first_name>
   <last_name>Tyson</last_name>
   <cud_operation>U</cud_operation>
   <address>
      <address_id>1</address_id>
      <city>San Jose</city>
      <street1>1108 First St.</street1>
      <street2></street2>
      <country>US</country>
      <cud_operation>U</cud _operation>
   </address>
   <address>
      <address_id>1</address_id>
      <city>San Jose</city>
      <street1>1108 First St.</street1>
      <street2></street2>
      <country>US</country>
      <cud_operation>D</cud _operation>
   </address>
</p_customer>

例 - 複数のデータ ソースの更新

以下の例では、顧客情報を読み込んで更新します。最初のデータ ソースのデータで置き換えて、2 番目のデータ ソースで顧客データを挿入します。同様に、この例では、関連のアドレス情報を読み込んで更新します。最初のデータ ソースでデータを置き換えて、2 番目のデータ ソースでアドレス データを挿入します。

declare procedure tns:update($p1 as element(p_customer)) {
   declare $c as element(customer) := getCustomerInfoByCustID(data($p1/customer_id));
   declare $cc as changed-element(customer) := fn-bea:changed-element($c);
   declare $curc as element(customer);

   if (data($p1/cud_operation) eq "U") then {
      set $cc := fn-bea:replace-value($cc, "first_name", data($p1/first_name));
      set $cc := fn-bea:replace-value($cc, "last_name", data($p1/last_name));
      set $cc := fn-bea:replace-value($cc, "ssn", data($p1/ssn));

      updateCustomer($cc); (: これは 1 番目のデータ ソースで更新されます。:)

      set $curc := fn-bea:current-value($cc);
      insertCustomer($curc); (: これは、 2 番目のデータ ソースで挿入されます。:)
   }

   {
      declare $addr as element(address) := getAddressInfoByCustID(data($p1/customer_id));
      declare $caddr as changed-element(address) := fn-bea:changed-element($addr);
      declare $curaddr as element(address);
      declare $paddr := $p1/address[1];

      if (data($p1/cud_operation) eq "U") then {
         set $caddr := fn-bea:replace-value($caddr, "city", data($paddr/city));
         set $caddr := fn-bea:replace-value($caddr, "street1", data($paddr/street1));
         set $caddr := fn-bea:replace-value($caddr, "street2", data($paddr/street2));
         set $caddr := fn-bea:replace-value($caddr, "country", data($paddr/country));

         updateAddress($caddr); (: これは 1 番目のデータ ソースで更新されます。:)

         set $curaddr :=
            <address>
               <address_id>{ data($paddr/address_id) }</address_id>
               <city>{ data($paddr/city) }</city>
               <street1>{ data($paddr/street1) }</street1>
               <street2>{ data($paddr/street2) }</street2>
               <country>{ data($paddr/country) }</country>
            </address>

         insertAddress($curaddr); (: これは、2 番目のデータ ソースで挿入されます。:)
      }
   }
}

関連項目

コンセプト
ガイド
参考
2008 年 04 月 10 日に 11:47 に Confluence によって作成されたドキュメント